package shoot;

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.print.attribute.standard.MediaSize.Other;

/**
 * 所有飞行物超类
 * @author pc
 *
 */
public abstract class FlyingObject {
	/**
	 * 飞行物的 长、宽、坐标
	 */
	protected int width;
	protected int height;
	protected int x;
	protected int y;
	
	/**
	 * 飞行物的状态
	 */
	
	public static final int LIFT=1;  //存活
	public static final int REMOVE=2;//移除
	public static final int DIE=3;   //消失
	public int status=LIFT;          //初始状态
	
	
	/**
	 * 构造方法（长宽 坐标一定）
	 * @param width 长
	 * @param height 宽
	 * @param x x轴
	 * @param y y轴
	 */
	public FlyingObject(int width,int height,int x,int y) {
		this.width=width;
		this.height=height;
		this.x=x;
		this.y=y;
	}
	
	/**
	 * 构造方法，初始位置 随机
	 * @param width 飞行物宽度
	 * @param height 飞行物长度
	 */
	public FlyingObject(int width,int height) {
		this.width=width;
		this.height=height;
		Random random=new Random();
		//飞行物初始的坐标随机
		this.x=random.nextInt(World.WIDTH-this.width);
		this.y=-this.height;
	}
	
	/**
	 * 加载图片,静态资源
	 * @return
	 */
	public static BufferedImage loadImage(String filename) {
		try {
			BufferedImage img = ImageIO.read(FlyingObject.class.getResource(filename));
			return img;
		} catch (Exception e) {
			//打印异常 并抛出
			e.printStackTrace();
			throw new RuntimeException();
		}
	}
	
	/**
	 * 根据不同的状态，获取不同情况下的图片
	 */
	
	public abstract BufferedImage getImage();
	
	/**
	 * 画图片,不需要返回
	 */
	public void paintObject(Graphics g) {
		 g.drawImage(getImage(), x, y,null);
	}
	
	/**
	 * 判断存活
	 * @return
	 */
	public boolean isLift() {
		if (status==LIFT) {
			return true;
		}
		return false;
	}
	/**
	 * 判断是否移除
	 * @return
	 */
	public boolean isRemove() {
		if (status==REMOVE) {
			return true;
		}
		return false;
	}
	/**
	 * 判断是否死亡
	 * @return
	 */
	public boolean isDie() {
		if (status==DIE) {
			return true;
		}
		return false;
	}
	
	/**
	 * 飞行物移动
	 */
	public abstract void step();
	
	
	/**
	 * 判断飞行物是否越界
	 * @return 
	 */
	public boolean outOfBound() {
		return this.y>World.HEIGHT;
	}
	
	/**
	 * 改变飞行物的状态
	 */
	public void goDie() {
	  	status=DIE;
	}
	
	/**
	 * 飞行物碰撞
	 * 以敌机为参考，子弹和英雄机为参数
	 * @param obj 
	 * @return
	 */
	public boolean hit(FlyingObject otherObject) {
		//判断碰撞范围
		int x1=x-otherObject.width;
		int y1=y-otherObject.height;
		int x2=x+otherObject.width;
		int y2=y+otherObject.height;
		//子弹或英雄机的坐标
		int x=otherObject.x;
		int y=otherObject.y;
		
		//在范围内 就碰撞
		return x>x1 && x<x2 && y>y1 && y<y2;
	}
	
	
	
}	
